perm filename ERROR.SAI[PUB,TES]2 blob
sn#150106 filedate 1975-03-11 generic text, type T, neo UTF8
00100 BEGOF("ERROR")
00200 COMMENT
00300
00400 *** Variations at Different Sites ***
00500
00600 CALLEDITOR works only if compiler-editor linkages are available, and
00700 is different at each site.
00800
00900 LOSERR is used at sites with a pre-April-74 SAIL lacking the
01000 three-argument form of USERERR.
01100
01200 ***
01300
01400 Pass One Error Handler, first done sans-SAIL by Rich Johnsson.
01500 Whenever possible, PUB and SAIL errors are trapped by the procedure
01600 REPORT. However, SAIL requires that REPORT be a SIMPLE PROCEDURE, so
01700 to avoid recursion, there are times that REPORT is disabled and
01800 NREPORT or USERERR is used instead. Furthermore, before PUB
01900 initiallization is complete, REPORT would not work, so EARLYWARNING
02000 (which calls USERERR) is used for errors instead of the usual WARNN
02100 (which calls REPORT).
02200
02300 WARN(SHORT, LONG) puts the error message LONG on the terminal. IF
02400 SHORT = "=", the same message is put in the right margin in
02500 DEBUGmode., if SHORT = NULL, no message goes in the right margin.,
02600 else, SHORT goes in the right margin.
02700
02800 Actually, WARN(SHORT,LONG) is a macro which expands to
02900 WARNN(UNIQUEOWNINTEGERVARIABLE, SHORT, LONG) so that there is a place
03000 to remember the occurrence of "Q" and "A" responses.
03100
03200 ;
03300
03400 EXTERNAL INTEGER !ERRP! ;
03500
03600 PROCEDURES
00100 PUBLIC SIMPLE PROCEDURE ERROR! ;$"#
00200 BEGIN "ERROR!"
00300 TES 8/20/74 INTERCEPT SAIL ERRORS ;
00400 !ERRP! ← LOCATIONOFERROR ← LOCATION(REPORT) ;
00500 COMMENT THE VARIABLE GETS AROUND A SAIL BUG FIXED BY RHT SEP 74;
00600 END "ERROR!" ;
00100 IFK CMUVER OR SAILVER THENK
00200 RKJ: 6-25-74 Do your own USERERR;
00300
00400 PRIVATE PROCEDURE CALLEDITOR(STRING EDNAME) ;$"#
00500 BEGIN TES 8/20/74 ADDED SAIL CASES ;
00600 SAFE INTEGER ARRAY B[0:5];
00700 STRING FILE;
00800 INTEGER LINE,PAGE,F,E,P;
00900 FILE←INCHWL;
01000 IF FULSTR(FILE)
01100 THEN LINE←PAGE←0
01200 ELSE
01300 BEGIN "DEFAULTFILE"
01400 FILE←THISFILE;
01500 LINE←CVASC(SRCLINE) LOR 1;
01600 PAGE←CVD(SRCPAGE);
01700 END "DEFAULTFILE";
01800 B[0]←CVSIX("SYS");
01900 B[1]←CVSIX(EDNAME);
02000 B[2]←B[3]←B[4]←B[5]←0;
02100 F←CVFIL(FILE,E,P);
02200 START!CODE "RUNEDITOR"
02300 MOVE '14,F; MOVE '13,E; MOVE '11,P; MOVE '16,PAGE; MOVE '15,LINE;
02400 MOVE 1,B; HRLI 1,1;
02500 IFC CMUVER THENC CALLI 1,-'22; ELSEC CALLI 1,'35; ENDC RKJ: 7-Nov-74 and 6-Feb-75;
02600 JRST 4,0;
02700 END "RUNEDITOR";
02800 END "CALLEDITOR";
02900 ENDC
00100 PUBLIC SIMPLE PROCEDURE DUSERERR ;$"#
00200 BEGIN "DUSERERR"
00300 STRING USER!MESSG;
00400 PASS;
00500 USER!MESSG ← E(NULL,NULL);
00600 IF ON THEN WARN("=",USER!MESSG);
00700 END "DUSERERR";
00100 PUBLIC STRING SIMPLE PROCEDURE EARLYWARNING(STRING MESSG) ;$"#
00200 USERERR(0,1,MESSG) ; TES 8/20/74 USED BEFORE INITIALLIZATION IS COMPLETE ;
00100 PUBLIC STRING SIMPLE PROCEDURE ERRLINE ;$"#
00200 RETURN(IF EQU(MAINFILE, THISFILE) THEN SRCLINE
00300 ELSE THISFILE&SP&SRCLINE) ;
00100 PUBLIC SIMPLE PROCEDURE IMPOSSIBLE(STRING WHERE) ;$"#
00200 WARN("=","Impossible CASE index in " & WHERE &
00300 " at " & SOMEINPUT);
00100 IFSITE TENEX THENK
00200
00300 PRIVATE SITE(TENEX) SIMPLE STRING PROCEDURE INCHWL ;$"#
00400 BEGIN
00500 STRING S ; INTEGER C ;
00600 S ← NULL ;
00700 DO
00800 BEGIN
00900 C ← PBIN ;
01000 IF C = CTLA THEN
01100 IF NULSTR(S) OR EQU(S[∞-3 TO ∞], CRLF&"##") THEN
01200 ELSE BEGIN
01300 TES 8/23/74 ↑A ECHOES ANYWAY, SO FORGET PBOUT("\") ;
01400 PBOUT(S[∞ FOR 1]) ;
01500 S ← S[1 TO ∞-1] ;
01600 END
01700 ELSE IF C = CTLS THEN OUTSTR(" =" & EOL & "#" & S)
01800 ELSE IF C = EOL OR C = ALTMODE THEN RETURN(S)
01900 ELSE IF C = CTLV THEN S ← S & PBIN
02000 ELSE IF C=RUBOUT THEN
02100 BEGIN
02200 OUTSTR(" XXX" & EOL & "#") ;
02300 S ← NULL ;
02400 END
02500 ELSE IF C = LF THEN TES 8/23/74 ;
02600 IF LAST<4 THEN RETURN(S)
02700 ELSE BEGIN OUTSTR(CR&"##") ; S ← S & (CRLF&"##") END
02800 ELSE IF C = CTLQ THEN TES 8/23/74 ;
02900 BEGIN
03000 OUTSTR("←"&CRLF&"#") ;
03100 WHILE FULSTR(S) AND NOT EQU(S[∞-3 TO ∞],CRLF&"##") DO S←S[1 TO ∞-1] ;
03200 IF FULSTR(S) THEN OUTSTR("#") ;
03300 END
03400 ELSE S ← S & C ;
03500 END UNTIL FALSE ;
03600 END "INCHWL" ;
03700
03800 ENDC
00100 IFK ITSVER THENK COMMENT THEIR USERERR HAS 3 ARGS ;
00200 PRIVATE SIMPLE PROCEDURE LOSERR(INTEGER RSP) ;$"#
00300 BEGIN
00400 DEFINE !BREAK = " '45000000000" ;
00500 EXTERNAL INTEGER JOBSA ;
00600
00700 IF RSP="X"
00800 THEN START!CODE !BREAK '16,'40000 END
00900 ELSE IF RSP="S"
01000 THEN START!CODE MOVE 1,JOBSA; JRST (1) END
01100 ELSE IF RSP="D" THEN START!CODE !BREAK '16,'3000000 END;
01200 END "LOSERR";
01300 ENDC
00100 PRIVATE SIMPLE INTEGER PROCEDURE NREPORT(INTEGER LOC; STRING MESG, RSP) ;$"#
00200 RETURN(RSP + 3 LSH 18) ; TES 8/20/74 CALLED BY REPORT ;
00100 PUBLIC SIMPLE INTEGER PROCEDURE REPORT (INTEGER LOC; STRING MESG, RSP) ;$"#
00200 BEGIN "REPORT" RKJ 6/25/74 TES 8/20/74 ;
00300 COMMENT SAIL CALLS REPORT(LOC,CRLF&MESG&CRLF,NULL),
00400 WARN CALLS REPORT(0,MESG,NULL|"A"),
00500 OTHERS CALL REPORT(0,MESG|NULL,RSP) ;
00600 EXTERNAL INTEGER !JBSA,!JBDDT;
00700 INTEGER CHAR;
00800 DEFINE CLRBFI= [START!CODE TTCALL '11,0 END];
00900 IF LOC=0 AND NOT SWDBACK THEN OUTSTR(CRLF) ; SWDBACK←TRUE;
01000 IF FULSTR(MESG) THEN BEGIN OUTSTR(MESG); IF LOC=0 THEN OUTSTR(CRLF) END ;
01100 IF NOT ERRLF THEN
01200 IF (CHAR←INCHRS)=LF
01300 THEN ERRLF←TRUE;
01400 IF LOC THEN OUTSTR(
01500 "This is a SAIL error - Probably a PUB bug. Called from location "&CVOS(RH(LOC))&CRLF) ;
01600 IF NOT ON THEN OUTSTR("In the false part of a conditional"&CRLF) ;
01700 OUTSTR("Line/Page "&ERRLINE&"/"&SRCPAGE&"["&MACLINE&"]"&CRLF) ;
01800 CHAR ← RSP ;
01900 IF NOT ERRLF THEN
02000 WHILE TRUE DO
02100 BEGIN "ERRLOOP"
02200 IF NOT CHAR THEN
02300 BEGIN
02400 OUTCHR("↑");
02500 IFC TENEX THENC CLRBUF ELSEC CLRBFI ENDC ;
02600 CHAR ← INCHRW ;
02700 IF "a" LEQ CHAR LEQ "z" THEN CHAR ← CHAR LAND '137 ;
02800 END ;
02900 IF CHAR=CR THEN BEGIN INCHWL; CHAR←0; DONE END ELSE
03000 IF CHAR="C" OR CHAR='37 THEN BEGIN CHAR←0; DONE END ELSE
03100 IF CHAR=LF THEN BEGIN ERRLF←TRUE; CHAR←0; DONE END ELSE
03200 IF CHAR="X" THEN DONE ELSE
03300 IF CHAR="S" THEN DONE ELSE
03400 IF CHAR="D" THEN
03500 IFC TENEX THENC DONE ELSE ELSEC
03600 BEGIN
03700 IF !JBDDT NEQ 0
03800 THEN DONE
03900 ELSE OUTSTR(CRLF&"No DDT"&CRLF);
04000 END ELSE
04100 ENDC
04200 IFC SAILVER OR CMUVER THENC
04300 IF CHAR="E" THEN CALLEDITOR(IFC SAILVER THENC "SOS" ELSEC "LINED" ENDC) ELSE
04400 ENDC
04500 IFC SAILVER THENC
04600 IF CHAR="T" THEN CALLEDITOR("E") ELSE
04700 ENDC
04800 IF CHAR="P" THEN
04900 BEGIN TES: PUB INTERACTIVE DEBUGGER ;
05000 INTEGER LASTWAS, TEXTWAS, BRCWAS, ONWAS ;
05100 LASTWAS←LAST ; TEXTWAS←TEXTMODE ; ONWAS←ON ; ON←TRUE ;
05200 OUTSTR(CRLF&"= = = = ="&CRLF) ;
05300 !ERRP! ← 0 ; COMMENT PREVENT RECURSION ;
05400 SWICH("START PUB!DEBUG END;;" &
05500 (IF NOT TEXTMODE THEN CRLF&TB&TB
05600 ELSE RCBRAK), -1, 0) ; TES 8/23/74;
05700 TEXTMODE ← 0 ; TES 8/23/74 ;
05800 PASS ; STATEMENT ;
05900 !ERRP! ← LOCATIONOFERROR ;
06000 OUTSTR("= = = = ="&CRLF) ;
06100 ON ← ONWAS ;
06200 IF TEXTWAS THEN
06300 BEGIN
06400 WHILE LAST>LASTWAS DO SWICHBACK ;
06500 EMPTYTHIS ; EMPTYTHAT ;
06600 TEXTMODE ← TRUE ; BRC ← BRCWAS ;
06700 END ;
06800 END
06900 ELSE
07000 IF CHAR = "Q" AND NOT LOC THEN
07100 BEGIN LOC←TRUE; OUTSTR(CRLF) ; DONE END ELSE
07200 IF CHAR = "A" AND NOT LOC THEN
07300 BEGIN
07400 LOC←TRUE;
07500 OUTSTR(IF RSP="A" THEN "AUTO-CONTINUE"&CRLF ELSE CRLF) ;
07600 DONE ;
07700 END ELSE
07800 IF CHAR = "?" THEN
07900 BEGIN
08000 OUTSTR("Reply" & CRLF &
08100 "<CR> to continue," & CRLF &
08200 "<LF> to continue automatically from all messages," & CRLF &
08300 """A"" to continue automatically from this message,"& CRLF &
08400 """Q"" to quiet this message," & CRLF &
08500 """P"" to enter PUB debug loop, " & CRLF
08600 );
08700 IFC NOT TENEX THENC IF !JBDDT NEQ 0 THEN ENDC
08800 OUTSTR("""D"" to enter DDT, ") ;
08900 OUTSTR(
09000 IFC SAILVER THENC
09100 """E"" or ""T"" to EDIT, "&
09200 ELSEC
09300 IFC PARCVER THENC
09400 """E"" to EDIT, "&
09500 ENDC ENDC
09600 """X"" to exit, ""S"" to start over"&CRLF);
09700 END ELSE OUTSTR(" ? FOR HELP"&CRLF) ;
09800 CHAR ← 0 ;
09900 END "ERRLOOP" ;
10000 IF LOC OR NOT CHAR THEN RETURN(CHAR + 3 LSH 18)
10100 ELSE BEGIN "BUGGY"
10200 !ERRP! ← LOCATION(NREPORT) ; COMMENT SIMPLE PROCEDURES CAN'T RECURSE ;
10300 IFC ITSVER THENC
10400 LOSERR(CHAR) ;
10500 ELSEC
10600 USERERR(0, 1, NULL, CHAR) ;
10700 ENDC
10800 !ERRP! ← LOCATIONOFERROR ;
10900 RETURN(0) ;
11000 END "BUGGY" ;
11100 END "REPORT";
00100 PUBLIC STRING SIMPLE PROCEDURE SOMEINPUT ;$"#
00200 RETURN(SP&THISWD&SP&
00300 (IF THATISFULL THEN LIT!ENTITY&LIT!TRAIL ELSE NULL)&INPUTSTR[1 TO 80]);
00100 PUBLIC STRING PROCEDURE TYPEIN ;$"#
00200 BEGIN
00250 RKJ: 6-FEB-75 MODS FOR AUTOCRLF;
00300 IF NOT ON THEN RETURN (NULL); RKJ: 5-10-74 ;
00400 IF (NOT SWDBACK) AND AUTOCRLF THEN BEGIN OUTSTR(CRLF) ; SWDBACK ← TRUE END ;
00500 IF AUTOCRLF THEN OUTSTR("#") ;
00600 RETURN(INCHWL) ;
00700 END "TYPEIN" ;
00100 PUBLIC STRING SIMPLE PROCEDURE WARNN(REFERENCE BOOLEAN QUIETER; STRING SHORT!VERSION,LONG!VERSION) ;$"#
00200 BEGIN "WARN"
00300 COMMENT USUALLY CALLED BY WARN(SHORT, LONG) -- DEFINED AS:
00400 BEGIN OWN INTEGER <NEWNAME> ., WARNN(<NEWNAME>, SHORT, LONG) END ;
00500 COMMENT MAYBE THERE WAS A "Q" RESPONSE BEFORE ;
00600 IF QUIETER="Q" OR NULSTR(LONG!VERSION) THEN
00700 ELSE IF !ERRP! THEN QUIETER ← RH(REPORT(0, LONG!VERSION, QUIETER))
00800 ELSE USERERR(0, 1, LONG!VERSION) ; COMMENT PREVENT RECURSION ;
00900 IF DEBUG AND MESGS<MESSMAX AND FULSTR(SHORT!VERSION) THEN
01000 MESGSARR[MESGS←MESGS+1] ← IF SHORT!VERSION = "=" THEN LONG!VERSION ELSE SHORT!VERSION ;
01100 RETURN(NULL) ;
01200 END "WARN" ;
00100 FINISHED
00200
00300 ENDOF("ERROR")